

// 饿汉模式的，单例模式 实现
// 此处保证 Singleton 这个类只能创建出一个实例
class Singleton{

    //在此处先把这个实例给创建出来
    private  static Singleton instance = new Singleton();
    // static 这个是类属性
    // 所以这个 Singleton 属性 和实例无关，而是和类相关！
    // 由于 类对象在java进程里，只是有唯一一份的，因此类对象的内部的 类属性也是唯一一份了

    // 获取实例,如果我们需要使用这个唯一实例，统一通过 Singleton.getInstance() 这个方式来获取
    public static Singleton getInstance(){
        return instance;
    }

    // 为了避免 Singleton 类不小心被复制多份出来。
    // 把构造方法设为private 在类外面，就无法通过 new 的方式来创建一个 Singleton 实例了
    private Singleton() {}

}

public class ThreadCase1 {
    // 多线程的相关案例1： 单例模式 （是设计模式的一种）
    public static void main(String[] args) {
        // 单例模式 => 单个 实例（对象）
        // 在有些场景中，有的特定的类，只能创建一个实例，不应该创建多个实例
        // 所以 使用了单例模式之后 ， 此时想创建多个实例，都难~~
        // 在java 中实现单例模式的实现方式有很多种： 之中是饿汉模式 一种是懒汉模式

        Singleton singleton = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton == singleton2); // 这里返回的值是 true 说明不论设置多少个对象就是指向同一个对象


        // 并且不能 new 一个对象
        // 这种写法呢 就是 在类加载阶段 就把实例给创建出来了 （类加载是比较考前的阶段）
        // 这种效果就是给人一种"特别急切"的感觉

        // 1) static 保证这个实例的唯一
        // 2) static 保证这个实例确实在一定的时机中被创建出来的
        // (static 是这个实现方式的灵魂角色)

        // 所以总共有两步 , 就是 static 这个操作 是让当前的instance 属性是类属性了
        // 2. 构造方法是设置为 private,外面的代码中无法new

    }
}
